package com.cy.pj.sys.web.controller;

import com.cy.pj.common.util.PageUtil;
import com.cy.pj.sys.pojo.SysNotice;
import com.cy.pj.sys.service.SysNoticeService;
import com.cy.pj.sys.web.pojo.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;




/**
 * 这个类我们称之为控制层对象的处理器(Handler),通过此对象处理
 * DispatcherServlet(核心控制器-Controller)分发的请求,具体的
 * 处理包括:
 * 1)定义请求url映射
 * 2)通过参数对象封装请求参数数据
 * 3)调用业务方法处理业务逻辑
 * 4)封装处理结果交给DispatcherServlet进行处理.
 *
 * restful 风格url 对于notice模块而言--对外相当于提供一个接口(根据请求的方式去请求)
 * 查询操作:@GetMapper     /notice/
 *添加操作 :@PostMapper   /notice/
 *修改操作:@PutMapper    /notice/
 *删除操作:@DeleteMapper /notice/{id}/
 *基于id查询:@GetMapper   /notice/{id}/
 */

@RequestMapping("/notice/")
@RestController  //@Controller+@ResponseBody
//@Controller
public class SysNoticeController {
    //这里写的controller又称之为handler,也叫做后端的controller,还是属于mvc中的m
    @Autowired
    private SysNoticeService sysNoticeService;
    //http://localhost:1314/notice/doFindNotices
    //http://localhost:1314/notice/doFindNotices?type=1&modifiedUser=tony

    //此方法会由DispatcherServlet (controller)对象通过反射进行调用
    //dispatcherServlet拿到请求中参数时会将参数注入给反射调用的方法参数
//    @GetMapping("/doFindNotices")
    @GetMapping
    //@ResponseBody//将返回值转换成json字符串
    public JsonResult doFindNotice(SysNotice notice){//框架会基于请求的url通过反射
        PageUtil.startPage();
        return new JsonResult(sysNoticeService.findNotices(notice));
         /*
        此方法的返回值会交给DispatcherServlet，假如方法有 @ResponseBody注解修饰,
        DispatcherServlet会调用jackson(j哥损) api将方法的返回值转换为Json格式字符串，
        底层转换时会调用返回值对象的get方法，以get方法的方法名(去掉get单词)为key
        ,get方法的返回值为value来构建
        json格式字符串


        当存入的数据库中的数据出现乱码时,第一是查看数据库的字符集,再次到controller中输出,
        得到的数据是否正常,如果正常可以就可以配置文件中没有设置字符集(yml)
        */
    }
//    @PostMapping("/doSaveNotice")
        @PostMapping
    //@RequestBody使用该注解修饰参数时,请求必须是post请求,body(请求头)是json格式,内容是json{"title":"a","type":"a",...}
    //@RequestBody描述参数是,同一个方法中的参数只能有一个,不能多个这样的注解
    public JsonResult insert(@RequestBody SysNotice notice){
        sysNoticeService.saveNotice(notice);
        return new JsonResult("doSaveNotice ok");
    }
//    @DeleteMapping("/doDeleteById/{ids}")
    @DeleteMapping("{ids}")
    public JsonResult delete(Long... id){//参数名不能任意起,必须对应接口中的参数名
        int i = sysNoticeService.deleteById(id);
        return new JsonResult("delete ok");
    }
//    @PutMapping("/doUpdateNotice")
    @PutMapping
    public JsonResult update(SysNotice notice){//使用对象的方式来接收参数
        //更新在postman中是put请求,添加是post请求,查询是get请求,删除是Delete请求
        sysNoticeService.updateNotice(notice);
        return new JsonResult("update ok");
    }

    /**基于id查询notice对象**/
    //rest风格url(软件架构编码风格),允许在url中基于{}方式定义变量
    //rest风格应用目的:让url的设计更加通用和简单
    //访问url: http://ip:port/notice/doFindById/14
    //方法参数的值假如来自url中{var}变量的值,则需要使用@PathVariable注解对参数进行描述
//    @GetMapping("/doFindById/{id}")
    @GetMapping("{id}")

    public JsonResult doFindById(@PathVariable Long id){//直接量的方式来接收参数(数组也是直接量)
        return new JsonResult(sysNoticeService.findById(id));
    }

}
/**
 * 请求响应处理
 * 请求数据:
 * 1)请求url的定义(普通风格url,rest风格url)
 * 2)请求方式的设计 (@GetMapping,@PostMapping,@DeleteMapping,@PutMapping,@RequestMapping)
 * 3)请求方法参数类型设计(直接量,pojo对象)
 * 4)请求方法参数修饰(@PathVariable->从url中取数据,@RequestBody-告诉服务端接收json数据,@RequestParam-对传统请求参数进行约束)
 * 响应数据
 * 1)响应标准设计
 * 2)响应数据转换(json格式数据)
 * 3)统一异常的处理(?)
 */
